#ifndef __BMP_H__
#define __BMP_H__

#include <stdio.h>
#include <dlfcn.h>  // 动态加载动态库的头文件：dlopen()、dlsym()
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>

#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <linux/input.h> // 系统定义输入设备操作的API
#include "lcd.h"

// BMP格式头规范
struct bitmap_header
{
	int16_t type;
	int32_t size; // 图像文件大小
	int16_t reserved1;
	int16_t reserved2;
	int32_t offbits; // bmp图像数据偏移量
}__attribute__((packed));

struct bitmap_info
{
	int32_t size;   // 本结构大小
	int32_t width;  // 图像宽
	int32_t height; // 图像高
	int16_t planes;

	int16_t bit_count; // 色深
	int32_t compression;
	int32_t size_img; // bmp数据大小，必须是4的整数倍
	int32_t X_pel;
	int32_t Y_pel;
	int32_t clrused;
	int32_t clrImportant;
}__attribute__((packed));

// 以下结构体不一定存在于BMP文件中，除非：
// bitmap_info.compression为真
struct rgb_quad
{
	int8_t blue;
	int8_t green;
	int8_t red;
	int8_t reserved;
}__attribute__((packed));


// BMP的结构
typedef struct BMP{
	int width;
	int height;
	int bpp;
	int row_size;	//不含pad的字节数
	int pad;	//填充多少
	int size;	// size_img
	char *rgb;
}BMP;

// 获取bmp信息
extern BMP *bmp_init(const char *bmpname);

//反初始化bmp
extern void bmp_uninit(BMP *bmp);

// 显示图片
// 获取BMP的信息（像素宽高，位深度，图像数据大小，图像数据）
// 把图像数据拷贝到LCD显存
// 释放资源
extern void anybmp(int xoff, int yoff, const char *bmpname, LCD *lcd);
#endif